package async;

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author fei.fang
 * @date 2021/8/27
 **/
public class ExchangerTest {

    private static final Exchanger<String> exg = new Exchanger<>();

    private static ExecutorService service = Executors.newFixedThreadPool(2);

//    public static void main(String[] args) {
//        service.execute(new Runnable() {
//            @Override
//            public void run() {
//                String a = "银行流水a";
//                String b = null;
//                try {
//                    b = exg.exchange(a);
//                    System.out.println("A 的数据" + a + ", B 的数据" + b);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }
//        });
//
//        service.execute(new Runnable() {
//            @Override
//            public void run() {
//                String b = "银行流水b";
//                String a = null;
//                try {
//                    a = exg.exchange(b);
//                    System.out.println("A 的数据" + a + ", B 的数据" + b);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//
//            }
//        });
//
//        service.shutdown();
//    }
    public static void main(String[] args) {
        ScheduledThreadPoolExecutor service4 = (ScheduledThreadPoolExecutor) Executors
                .newScheduledThreadPool(2);

        // 如果前面的任务没有完成，则调度也不会启动
        service4.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                try {
                    // 如果任务执行时间大于间隔时间，那么就以执行时间为准（防止任务出现堆叠）。
                    Thread.sleep(10000);
                    System.out.println(System.currentTimeMillis() / 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }// initialDelay（初始延迟） 表示第一次延时时间 ; period 表示间隔时间
        }, 0, 2, TimeUnit.SECONDS);


        service4.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                    System.out.println(System.currentTimeMillis() / 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }// initialDelay（初始延迟） 表示延时时间；delay + 任务执行时间 = 等于间隔时间 period
        }, 0, 2, TimeUnit.SECONDS);

        // 在给定时间，对任务进行一次调度
        service4.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("5 秒之后执行 schedule");
            }
        }, 5, TimeUnit.SECONDS);
    }

}
